import type {
  LLMCompletionsData,
  LLMAttachCheckRes,
  LLMCompletionsCb,
  LLMProviderConfig,
} from './type'

/**
 * 基础LLM提供商抽象类
 * 所有特定的LLM提供商（如OpenAI、Ollama等）都必须继承此类
 */
export abstract class llmBaseProvider {
  /** 基本路径 */
  private baseUrl: string
  /** 认证Key */
  private apiKey: string
  /** 初始模型 */
  private defaultModels: LLMModel[]

  /**
   * 初始化
   *
   * @param config 配置项
   */
  constructor(config: LLMProviderConfig) {
    this.baseUrl = config.baseUrl
    this.apiKey = config.apiKey
    this.defaultModels = config.defaultModels ?? []
    this.init()
  }

  /**
   * 子类初始化
   *
   * @returns
   */
  protected abstract init(): void

  /**
   * 获取API地址
   *
   * @returns
   */
  protected getBaseUrl = (): string => {
    return this.baseUrl
  }

  /**
   * 获取API密钥
   *
   * @returns
   */
  protected getApiKey = (): string => {
    return this.apiKey
  }

  /**
   * 获取初始模型
   *
   * @returns
   */
  protected getDefaultModels = (): LLMModel[] => {
    return this.defaultModels
  }

  /**
   * 访问测通
   *
   * @returns
   */
  abstract accessCheck(): Promise<boolean>

  /**
   * 检查模型支持的文档类型和限制
   *
   * @param model 选择的模型
   * @returns
   */
  abstract attachCheck(model: LLMModel): LLMAttachCheckRes

  /**
   * 获取可用模型列表
   *
   * @returns
   */
  abstract getModels(): Promise<LLMModel[]>

  /**
   * 标题生成
   *
   * @param model 模型key
   * @param messages 完整消息
   */
  abstract geneTitle(model: string, messages: LLMMessage[]): Promise<string>

  /**
   * 文本补全
   *
   * @param data 聊天补全参数
   * @param callback 回调事件
   */
  abstract completions(data: LLMCompletionsData, callback: LLMCompletionsCb): Promise<void>

  /**
   * 打断输出
   *
   * @returns
   */
  abstract abort(): Promise<void>
}
